package com.study.common.jdbc.annotation;

import com.study.common.jdbc.MyTransactionManager;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.sql.Connection;

/**
 * 方法前置增强
 * 方法后置增强
 * <p>
 * AOP主要两步实现原理---1、代理 2、织入
 *
 * 类似应用：
 * 一、方法执行耗时统计
 * E:\idea-workspace\netease\aop-theory> TimeConsumingStatisticsAspect
 *
 * 二、查询结果列表值补充customerName, userName（需要另外调用方法得到）
 * E:\idea-workspace\netease\annotationdemo> SetFieldValueAspect
 *
 *
 * @author: chenhs
 * @date: Created in 6:27 2019/11/21
 **/
@Component
@Aspect
public class MyTransactionalAspect {

    @Autowired
    private MyTransactionManager myTransactionManager;


    /**
     * 类似spring配置文件 声明式事务管理 com.study.*.save.*.*(..)
     *
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("@annotation(MyTransactional)") //凡是加了事务注解 --- 切入点
    public Object doTransactional(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        Connection connection = myTransactionManager.getConnection();
        connection.setAutoCommit(false);

        try {
            //增强
            System.out.println("方法执行前置增强");
            //约等于 --- 调用加了注解的那个方法
            Object result = proceedingJoinPoint.proceed();

            System.out.println("方法执行后置增强");

            connection.commit();
            System.out.println("正常执行，事务提交！");

            return result; 
        } catch (Exception e) {
            e.printStackTrace();
            connection.rollback();
            System.out.println("出现异常，事务回滚！");
        } finally {
            myTransactionManager.releaseConnection(connection);
        }

        return null;
    }


}
